package com.nnnu.wsnackshop.service;

import com.nnnu.wsnackshop.pojo.dto.AddProductDTO;
import com.nnnu.wsnackshop.pojo.dto.BatchUpdateStatusDTO;
import com.nnnu.wsnackshop.pojo.dto.ProductPageDTO;
import com.nnnu.wsnackshop.pojo.dto.ProductSearchDTO;
import com.nnnu.wsnackshop.pojo.dto.UpdateProductDTO;
import com.nnnu.wsnackshop.pojo.entity.Products;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nnnu.wsnackshop.pojo.vo.ProductDetailVO;
import com.nnnu.wsnackshop.pojo.vo.ProductVO;
import com.nnnu.wsnackshop.result.PageResult;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

/**
 * <p>
 * 商品表 服务类
 * </p>
 *
 * @author zk
 * @since 2025-05-14
 */
public interface IProductsService extends IService<Products> {
    PageResult<ProductVO> pageProducts(ProductPageDTO dto);

    /**
     * 根据分类ID查询商品，支持价格和销量排序
     * 使用SQL直接查询，避免内存排序
     * 
     * @param dto 查询参数
     * @return 分页结果
     */
    PageResult<ProductVO> pageProductsByCategory(ProductPageDTO dto);

    void addProduct(AddProductDTO dto);

    void updateProduct(UpdateProductDTO dto);

    void deleteProducts(List<Integer> ids);

    void updateStatus(Integer id, Integer status);

    ProductVO getProductDetail(Integer id);

    /**
     * 获取商品详情，增强版
     * 
     * @param id 商品ID
     * @return 商品详情VO
     */
    ProductDetailVO getProductDetail(Long id);

    void downloadTemplate(HttpServletResponse response) throws IOException;

    void exportProducts(HttpServletResponse response) throws IOException;

    void importProducts(MultipartFile file) throws IOException;

    /**
     * 批量更新商品状态
     *
     * @param dto 批量更新状态DTO
     */
    void batchUpdateStatus(BatchUpdateStatusDTO dto);

    /**
     * 获取热门商品
     * 
     * @return 热门商品列表
     */
    List<ProductVO> getPopularProducts();

    /**
     * 获取新品
     * 
     * @return 新品列表
     */
    List<ProductVO> getNewProducts();

    /**
     * 根据分类获取商品
     * 
     * @param categoryId 分类ID
     * @return 商品列表
     */
    List<ProductVO> getProductsByCategory(Long categoryId);

    /**
     * 搜索商品
     * 
     * @param searchDTO 搜索DTO
     * @return 搜索结果
     */
    PageResult<ProductVO> searchProducts(ProductSearchDTO searchDTO);

    /**
     * 获取商品销售数据，包括总销量、总收入和评价数
     *
     * @param productId 商品ID
     * @return 销售数据Map
     */
    Object getProductSalesData(Integer productId);
}
